<?php
/**
 * Representa um Cliente no sistema
 */
class Cliente implements IObject {

    /**
     * @var MyDb
     */
    public $tMysqli;

    private $IDCliente;
    private $ArIndividualData;
    private $ArEnterpriseData;
    private $ArGeneralData;
    private $Financeiro;
    private $ArChamados;
    private $ArComunicados;
    private $ArHistoricoSituacao;
    private $ArLancamentos;
    private $Report;

    public function __construct($IDCliente, $ArCustomerData, &$tMysqli) {
        $this->IDCliente = $IDCliente;
        $this->tMysqli = $tMysqli;
        $this->loadIndividualData($ArCustomerData);
        $this->loadEnterpriseData($ArCustomerData);
        $this->loadGeneralData($ArCustomerData);
        $this->loadFinancialData($ArCustomerData);
    }
    /**
     * @method  loadIndividualData
     *
     * Carrega os dados relacionados a PF
     *
     * @param   Array   $ArCustomerData     Dados relacionados a Pessoa Fisica
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    private function loadIndividualData($ArCustomerData) {
        $this->ArIndividualData = array(
            'IDPessoaFisica' => $ArCustomerData['IDPessoaFisica'],
            'StNome' => $ArCustomerData['StNome'],
            'StCpf' => $ArCustomerData['StCpf'],
            'StRg' => $ArCustomerData['StRg'],
            'DtNascimento' => $ArCustomerData['DtNascimento'],
            'StCargo' => $ArCustomerData['StCargo']
        );

    }
    /**
     * @method  loadEnterpriseData
     *
     * Carrega os dados relacionados a PJ
     *
     * @param   Array   $ArCustomerData Dados relacionados com a Pessoa Juridica
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    private function loadEnterpriseData($ArCustomerData) {
        $this->ArEnterpriseData = array(
            'IDPessoaJuridica' => $ArCustomerData['IDPessoaJuridica'],
            'IDRepresentante' => $ArCustomerData['IDRepresentante'],
            'StRazaoSocial' => $ArCustomerData['StRazaoSocial'],
            'StNomeFantasia' => $ArCustomerData['StNomeFantasia'],
            'DtFundacao' => $ArCustomerData['DtFundacao'],
            'StCnpj' => $ArCustomerData['StCnpj']
        );
    }
    /**
     * @method  loadGeneralData
     *
     * Carrega os dados genericos relacionados ao cliente
     *
     * @param   Array   $ArCustomerData Dados de Contatos com o cliente
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    private function loadGeneralData($ArCustomerData) {
        $this->ArGeneralData = array(
            'IDCliente' => $ArCustomerData['IDCliente'],
            'IDUsuario' => $ArCustomerData['IDUsuario'],
            'StEmail' => $ArCustomerData['StEmail'],
            'EnStatus' => $ArCustomerData['EnStatus'],
            'EnTipoCliente' => $ArCustomerData['EnTipoCliente'],
            'DtInscricao' => $ArCustomerData['DtInscricao'],
            'StEndereco' => $ArCustomerData['StEndereco'],
            'StNumero' => $ArCustomerData['StNumero'],
            'StComplemento' => $ArCustomerData['StComplemento'],
            'StBairro' => $ArCustomerData['StBairro'],
            'StCidade' => $ArCustomerData['StCidade'],
            'StEstado' => $ArCustomerData['StEstado'],
            'StCep' => $ArCustomerData['StCep'],
            'StDddTelefone' => $ArCustomerData['StDddTelefone'],
            'StTelefone' => $ArCustomerData['StTelefone'],
            'StDddCelular' => $ArCustomerData['StDddCelular'],
            'StCelular' => $ArCustomerData['StCelular']
        );
    }
    /**
     * @method  loadFinancialData
     *
     * Carrega o objeto de informacoes financeiras
     *
     * @param   Array   $ArCustomerData Dados Financeiros do Cliente
     *
     * @since   Junho de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function loadFinancialData($ArCustomerData) {
        $this->Financeiro = new Financeiro($ArCustomerData, $this->tMysqli);
    }

    //Junho
    public function getHomeTime() {
        $ArDiffTime = dateDiff($this->ArGeneralData['DtInscricao'], now());
        return $ArDiffTime['day'];
    }
    //Abril
    public function isPessoaJuridica() {
        return !empty($this->ArEnterpriseData['IDPessoaJuridica']);
    }

    public function getFullAddress() {
        return $this->ArGeneralData['StEndereco'] . ' ' . $this->ArGeneralData['StNumero'] . ' ' . $this->ArGeneralData['StComplemento'];
    }

    public function daysSinceRegister() {
        $dateDiff = dateDiff($this->ArGeneralData['DtInscricao'], now());
        return $dateDiff['day'];
    }

    public function getCustomerName() {
        return $this->isPessoaJuridica() ? $this->ArEnterpriseData['StNomeFantasia'] : $this->ArIndividualData['StNome'] ;
    }
    public function getDocument(){
        return $this->isPessoaJuridica() ? $this->ArEnterpriseData['StCnpj'] : $this->ArIndividualData['StCpf'];
    }

    public function countDelayedReleases() {
        $ItDelayedRelease = 0;
        foreach( $this->ArLancamentos as $Release ) {
            if( $Release->isDelayed() ) {
                $ItDelayedRelease++;
            }
        }
        return $ItDelayedRelease;
    }

    public function isDelinquent() {
        if( empty($this->ArHistoricoSituacao) ) {
            return false;
        }
        return $this->ArHistoricoSituacao[0] != 'LIBERADO' && $this->ArHistoricoSituacao[0] != 'CANCELADO';
    }

    public function countHistoryOf($StHistoryName) {
        if(empty($this->ArHistoricoSituacao)) {
            return 0;
        }
        $ItHistoryTime = 0;
        foreach( $this->ArHistoricoSituacao as $HistoricoSituacao ) {
            if( $HistoricoSituacao->is($StHistoryName) ) {
                $ItHistoryTime++;
            }
        }
        return $ItHistoryTime;
    }

    public function isCancelled() {
        return $this->countHistoryOf('CANCELADO') > 0;
    }

    public function countReleasesPayments() {
        if( empty($this->ArLancamentos) ) {
            return 0;
        }
        $ItReleases = 0;
        foreach($this->ArLancamentos as $Lancamento) {
            if( $Lancamento->isRelease() ) {
                $ItReleases++;
            }
        }
        return $ItReleases;
    }

    public function getLancamentoById($IDCobranca){
        foreach($this->ArLancamentos as $Lancamento){
            if($Lancamento->getIDDebito() == $IDCobranca){
                return $Lancamento;
            }
        }
        return false;
    }

    //Getters
    public function getArGeneralData($StProp = false) {
        return !empty($StProp) ? $this->ArGeneralData[$StProp] : $this->ArGeneralData;
    }

    public function getArEnterpriseData($StProp = false) {
        return !empty($StProp) ? $this->ArEnterpriseData[$StProp] : $this->ArEnterpriseData;
    }

    public function getArIndividualData($StProp = false) {
        return !empty($StProp) ? $this->ArIndividualData[$StProp] : $this->ArIndividualData;
    }

    public function getIDCliente() {
        return $this->IDCliente;
    }

    public function getArChamados() {
        return $this->ArChamados;
    }

    public function setArChamados($ArChamados) {
        $this->ArChamados = $ArChamados;
    }

    public function getArComunicados() {
        return $this->ArComunicados;
    }

    public function setArComunicados($ArComunicados) {
        $this->ArComunicados = $ArComunicados;
    }

    public function getFinanceiro() {
        return $this->Financeiro;
    }

    public function getArHistoricoSituacao() {
        return $this->ArHistoricoSituacao;
    }

    public function setArHistoricoSituacao($ArHistoricoSituacao) {
        $this->ArHistoricoSituacao = $ArHistoricoSituacao;
    }

    public function getArLancamentos() {
        return $this->ArLancamentos;
    }

    public function setArLancamentos($ArLancamentos) {
        $this->ArLancamentos = $ArLancamentos;
    }

    public function getReport($StProp) {
        return $this->Report[$StProp];
    }

    public function setReport($Report) {
        $this->Report = $Report;
    }

    public function equals(IObject $Object) {

    }



}

?>
